Skip to content

从内存地址读取字符串 - GetStringFromPtr

函数简介

从指定内存地址读取字符串,参考 Windows 函数 GetWindowText 实现。

接口名称

GetStringFromPtr

DLL调用

int GetStringFromPtr(long ptr, LPSTR lpString, int size);

参数说明

参数名类型说明
ptr长整数型字符串内存地址。
lpString字符串接收字符串的缓冲区。
size整数型缓冲区大小,可通过 GetStringSize 接口读取字符串大小,size 要 +1 用于存储终止符 '\0'

示例

ptr 一般为其它接口返回的字符串指针。读取完成后如需释放,请调用 FreeStringPtr

SDK 调用

cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    int size = ola.GetStringSize(ptr) + 1;
    char* buffer = new char[size]();
    int ret = ola.GetStringFromPtr(ptr, buffer, size);
    // buffer 中即为读取到的字符串
    delete[] buffer;
    ola.FreeStringPtr(ptr);
}
csharp
using System.Text;
using OLAPlug;

var ola = new OLAPlugServer();
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0)
{
    StringBuilder sb = new StringBuilder(ola.GetStringSize(ptr) + 1);
    int ret = ola.GetStringFromPtr(ptr, sb, sb.Capacity);
    string result = sb.ToString();
    ola.FreeStringPtr(ptr);
}
python
from ctypes import create_string_buffer
from OLAPlugServer import OLAPlugServer

ola = OLAPlugServer()
# ptr 为其它接口返回的字符串内存地址
if ptr:
    size = ola.GetStringSize(ptr) + 1
    buf = create_string_buffer(size)
    ret = ola.GetStringFromPtr(ptr, buf, size)
    result = buf.value.decode("utf-8")
    ola.FreeStringPtr(ptr)
java
import com.olaplug.OLAPlugServer;

OLAPlugServer ola = new OLAPlugServer();
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    int size = ola.GetStringSize(ptr) + 1;
    byte[] buffer = new byte[size];
    int ret = ola.GetStringFromPtr(ptr, buffer, size);
    String result = new String(buffer, 0, Math.max(ret, 0)).trim();
    ola.FreeStringPtr(ptr);
}
go
import "github.com/ola/olaplug/olaplug"

ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
// ptr 为其它接口返回的字符串内存地址
if ptr != 0 {
    size := ola.GetStringSize(ptr) + 1
    buf := make([]byte, size)
    ret := ola.GetStringFromPtr(ptr, &buf[0], size)
    result := string(buf[:ret])
    ola.FreeStringPtr(ptr)
}
rust
use olaplug::OLAPlugServer;

let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
// ptr 为其它接口返回的字符串内存地址
if ptr != 0 {
    let size = ola.get_string_size(ptr) + 1;
    let mut buf = vec![0u8; size as usize];
    let ret = ola.get_string_from_ptr(ptr, &mut buf, size);
    let result = String::from_utf8_lossy(&buf[..ret as usize]).to_string();
    ola.free_string_ptr(ptr);
}
cpp
var ola = com("OlaPlug.OlaSoft")
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    var size = ola.GetStringSize(ptr) + 1
    var buffer = space(size)
    var ret = ola.GetStringFromPtr(ptr, buffer, size)
    ola.FreeStringPtr(ptr)
}
vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
' ptr 为其它接口返回的字符串内存地址
If ptr <> 0 Then
    size = ola.GetStringSize(ptr) + 1
    buffer = Space(size)
    ret = ola.GetStringFromPtr(ptr, buffer, size)
    ola.FreeStringPtr(ptr)
End If
text
.局部变量 ola, OLAPlug
.局部变量 buffer, 文本型
.局部变量 size, 整数型
.局部变量 ret, 整数型
ola.创建 ()
' ptr 为其它接口返回的字符串内存地址
.如果真 (ptr ≠ 0)
    size = ola.GetStringSize (ptr) + 1
    buffer = 取空白文本 (size)
    ret = ola.GetStringFromPtr (ptr, buffer, size)
    ola.FreeStringPtr (ptr)
.如果真结束
aardio
import OLAPlugServer;
var ola = OLAPlugServer();
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    var size = ola.GetStringSize(ptr) + 1;
    var buffer = string.buffer(size);
    var ret = ola.GetStringFromPtr(ptr, buffer, size);
    var result = tostring(buffer);
    ola.FreeStringPtr(ptr);
}
text
变量 ola <类型 = OLAPlugServer>
变量 buffer <类型 = 文本型>
变量 size <类型 = 整数>
变量 ret <类型 = 整数>
ola = 新建 OLAPlugServer
' ptr 为其它接口返回的字符串内存地址
如果真 (ptr ≠ 0)
    size = ola.GetStringSize (ptr) + 1
    buffer = 取空白文本 (size)
    ret = ola.GetStringFromPtr (ptr, buffer, size)
    ola.FreeStringPtr (ptr)
如果真结束
cpp
#include "OLAPlugServer.h"

OLAPlugServer ola;
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    int32_t size = ola.GetStringSize(ptr) + 1;
    char* buffer = new char[size]();
    int32_t ret = ola.GetStringFromPtr(ptr, buffer, size);
    delete[] buffer;
    ola.FreeStringPtr(ptr);
}

原生 DLL 调用

cpp
// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    char buffer[512] = {0};
    GetStringFromPtr(ptr, buffer, sizeof(buffer));
    FreeStringPtr(ptr);
}
csharp
using System.Runtime.InteropServices;
using System.Text;

[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetStringFromPtr(long ptr, StringBuilder lpString, int size);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int FreeStringPtr(long ptr);
[DllImport("OLAPlug_x64.dll", CallingConvention = CallingConvention.StdCall)]
static extern int GetStringSize(long ptr);

// ptr 为其它接口返回的字符串内存地址
if (ptr != 0) {
    StringBuilder sb = new StringBuilder(GetStringSize(ptr) + 1);
    GetStringFromPtr(ptr, sb, sb.Capacity);
    FreeStringPtr(ptr);
    string result = sb.ToString();
}
python
from ctypes import CDLL, c_int64, create_string_buffer

ola = CDLL("OLAPlug_x64.dll")
ola.GetStringSize.restype = c_int64
# ptr 为其它接口返回的字符串内存地址
if ptr:
    size = ola.GetStringSize(ptr) + 1
    buf = create_string_buffer(size)
    ola.GetStringFromPtr(ptr, buf, size)
    ola.FreeStringPtr(ptr)
    result = buf.value.decode("utf-8")

返回值

返回值说明
非 0成功,返回 字符串实际长度。
0失败。

注意事项

项目说明
使用此函数时需要确保传入的内存地址有效且可访问使用此函数时需要确保传入的内存地址有效且可访问。
GetStringSize建议在使用前先通过 GetStringSize 接口获取实际需要的缓冲区大小。
缓冲区大小不足可能导致字符串截断缓冲区大小不足可能导致字符串截断。
释放内存ptr 由插件接口返回,读取后需调用 FreeStringPtr 释放。